package com.xiaoxu.spzx.manager.service.impl;

import com.alibaba.excel.EasyExcel;
import com.xiaoxu.common.exception.XiaoXuException;
import com.xiaoxu.spzx.manager.listener.ExcelListener;
import com.xiaoxu.spzx.manager.mapper.CategoryMapper;
import com.xiaoxu.spzx.manager.service.CategoryService;
import com.xiaoxu.spzx.model.entity.product.Category;
import com.xiaoxu.spzx.model.vo.common.ResultCodeEnum;
import com.xiaoxu.spzx.model.vo.product.CategoryExcelVo;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public List<Category> findByParentId(Long parentId) {

        //1.查询所有的分类 通过id  select * from category where parent_id = 1 ;

        List<Category> categoryList = categoryMapper.selectCategoryByParentId(parentId);

        //2.根据已经查询到的分类 判断是否存在第二层数据，如果有设置hasChildren=ture，则实现懒加载方式

        if (!CollectionUtils.isEmpty(categoryList)){

            //这集合categoryList不为空  通过是否拥有第二层数据再次判断 如果有第二层数据 自己封装相对应的数据
            categoryList.forEach(category -> {

                //查询该分类下子类的数量
               // select count(*)  摄影摄像种类  from category where  parent_id  =  5 ;
                int count = categoryMapper.selectCountByParentId(category.getId());

                if(count > 0){
                    category.setHasChildren(true); //有第二层数据
                }else {
                    category.setHasChildren(false);//没有第二层数据
                }
            });
        }
        //注意返回数据  不返回什么都没有！！！！！！！！
        return categoryList;
    }

    @Override
    public void export(HttpServletResponse response) {

        try {
            //1 设置响应头信息 ，以及这个下载方式 ，
            // 设置响应结果类型
            response.setContentType("application/vnd.ms-excel");
            // 设置响应内容类型和编码
            response.setCharacterEncoding("utf-8");

            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("分类数据", "UTF-8");
            ///设置文件为下载模式
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

            //2 将数据写到文件中然后下载  调用mapper 返回所有的分类集合
             List <Category> categoryList = categoryMapper.selectAll();

             //想要的数据类型是 categoryExcelVo 而不是category 必须将数据类型转换 封装数据
             List<CategoryExcelVo> categoryExcelVoList = new ArrayList<>();
            //oops！
             for (Category category : categoryList){

                 //？每次循环都要放在 那里 所以需要new categoryExcelVo对象
                 CategoryExcelVo categoryExcelVo = new CategoryExcelVo();

                 BeanUtils.copyProperties(category,categoryExcelVo);

                 categoryExcelVoList.add(categoryExcelVo);

             }
             //3 将categoryList写进去excel
            EasyExcel.write(response.getOutputStream(), CategoryExcelVo.class)
                    .sheet("分类数据")
                    .doWrite(categoryExcelVoList);
        }catch (Exception e){
            throw  new XiaoXuException(ResultCodeEnum.DATA_ERROR);
        }

    }

    @Override
    public void importData(MultipartFile file) {
        ExcelListener<CategoryExcelVo>  excelListener = new ExcelListener<>(categoryMapper);
        try {
            //创建监听器对象，传递mapper对象

            //调用read方法读取excel数据
            EasyExcel.read(file.getInputStream(),
                    CategoryExcelVo.class,
                    excelListener).sheet().doRead();

        } catch (IOException e) {

            e.printStackTrace();

            throw new XiaoXuException(ResultCodeEnum.DATA_ERROR);
        }
    }
}
